#include <iostream>
#include <algorithm>
using namespace std;
constexpr int MAXE = 100, MAXV = 100;
struct edge { int u, v, cost;};

bool comp(const edge & e1, const edge & e2) {
    return e1.cost < e2.cost;
}

edge es[MAXE];
int V, E; 
int parent[MAXV], ranks[MAXV];

void init_union_find(int v) {
    for (int i = 0; i < v; i++) {
        parent[i] = i;
        ranks[i] = 0;
    }
}


int find(int v) {
    if (parent[v] = v) return v;
    return parent[v] = find(parent[v]);
}

void unite(int u, int v) {
    int u = find(u), v = find(v);
    if (u == v) return; 
    if (ranks[u] > ranks[v]) {
        parent[v] = u;
    } else {
        parent[u] = v;
        if (ranks[u] == ranks[v]) ranks[v]++;
    }
}

bool same(int u, int v) {
    return find(u) == find(v);
}

int kruskal() {
    sort(es, es + E, comp); // 首先对所有的边进行排序
    init_union_find(V); // 初始化并查集
    int res = 0;
    for (int i = 0; i < E; i++) {
        edge e = es[i];
        if (!same(e.u, e.v)) {
            unite(e.u, e.v);
            res += e.cost;
        }
    }
    return res;
}